﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托
{
 
    
    /// <summary>
    /// 委托要解决的问题：
    /// 1，传函数作为参数，回调函数
    /// 2，基于委托声明事件
    /// 
    /// 委托和事件的区别，就是委托需要赋初始值，事件不需要。
    /// </summary>

    internal class Program
    {

        // 声明一种委托类型
        public delegate void Welcom(string name);

        // 使用委托，定义一个事件变量
        // 通过查看源代码，event，其实是一个语法糖，最终是一个特殊的属性。
        public static event Welcom welcomEvent;

        static void Main(string[] args)
        {


            //test4();

            welcomEvent += Hello;
            welcomEvent += LiHao;

            // 事件本质上是一种特殊的委托变量，可以不赋初值。
            welcomEvent?.Invoke("yejing");



           Console.ReadLine();

        }

        public static void test1()
        {
            Welcom wc = new Welcom(LiHao);
            wc.Invoke("叶静");
        }

        public static void test2()
        {
            Welcom wc = new Welcom(LiHao);
            wc += Hello;
            wc.Invoke("yejing");
        }

        public static void test3()
        {
            func(LiHao);
            func(Hello);
        }

        public static void test4()
        {
            Program program = new Program();
            ChineseMen chineseMen = new ChineseMen();
            EnglishMen 
                english = new EnglishMen(); ;

            Welcom w = chineseMen.SyHi;
            w += english.SyHi;

            w?.Invoke("yejing");

        }


        static void func(Welcom sh)
        {
            sh("yejing");
        }



        public static void Hello(string name)
        {
            Console.WriteLine($" hello {name}");
        }

        public static void LiHao(string name)
        {
            Console.WriteLine($"你好,{name}");
        }
    }


    


    public class EnglishMen
    {
        public void SyHi(string name)
        {
            Console.WriteLine($"hello {name}");
        }
    }

    public class ChineseMen
    {
        public void SyHi(string name) { Console.WriteLine($"你好，{name}"); }
    }

}
